//
//  PhotoBrowserCell.swift
//  MicroBlog
//
//  Created by 002 on 15/10/28.
//  Copyright © 2015年 002. All rights reserved.
//

import UIKit
import SDWebImage
import SVProgressHUD

// MARK: - 点击退出图片协议
protocol PhotoBrowserCellDelegate : NSObjectProtocol {
    // 视图控制器将要关闭
    func photoBrowserCellDidTapImage()
    
    //  通知代理缩放比例
    func photoBrowserCellDidZoom(scale: CGFloat)
}

class PhotoBrowserCell: UICollectionViewCell {
    
    // 协议对象
    weak var Photodelegate : PhotoBrowserCellDelegate?
    
    var imageURL : NSURL? {
        didSet {
            
            guard let url = imageURL else {
                return
            }
//            print("\(url.absoluteString)")
            
            // 0. 回复 scrollView
            resetScrollView()
            
//            // 1. 加载缩略图
            let placeHolderImage = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(url.absoluteString)

            setPlaceHolder(placeHolderImage)
            
//            // 4. 异步加载高清大图
            // 如果 url 对应的图像已经被缓存，直接从磁盘读取，不会在从网络加载
            imageView.sd_setImageWithURL(bmiddleURL(url),
                placeholderImage: nil,
                options: [SDWebImageOptions.RetryFailed,
                        SDWebImageOptions.RefreshCached],
                progress: { (current, total) -> Void in
                
                    // 异步更新下载进度视图
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.placeHolder.progress = CGFloat(current) / CGFloat(total)
                    })
                }) { (image, _, _, _) -> Void in
                    
                    // 判断图像下载是否成功
                    if image == nil {
                        SVProgressHUD.showInfoWithStatus("您的网络不给力")
                        
                        return
                    }
                    
                    // 隐藏占位图
                    self.placeHolder.hidden = true
                    
                    // 设置大图的位置
                    self.setPosition(image)
            }
        }
    }
    
    /// 重设 scrollView 内容属性
    private func resetScrollView() {
        
        // 重置imageView的形变属性 - scrollView 在处理缩放的时候，是调用代理方法返回视图的 transform 来实现的
        imageView.transform = CGAffineTransformIdentity
        
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.contentOffset = CGPointZero
        scrollView.contentSize = CGSizeZero
    }
    
    // MARK: - 手势监听方法
    @objc private func tapImage() {
        Photodelegate?.photoBrowserCellDidTapImage()
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("hehe")
    }

    /// 设置imageView的位置
    ///
    /// :param: image image
    /// 也成为 长/短图
    private func setPosition(image: UIImage) {
        
        // 1. 获取按比例处理后图片的尺寸
        let size = displaySize(image)
        
        // 2. 比较判断
        if size.height < scrollView.bounds.height {
            
            // 1) 上下居中显示
            // - 调整 frame 的 x/y，一旦缩放，影响滚动范围
            imageView.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
            let y = (scrollView.bounds.height - size.height) * 0.5
            scrollView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
            
        } else {
            
            imageView.frame = CGRectMake(0, 0, size.width, size.height)
            
            // 因为图片尺寸大于srollView大小，需要设置滚动范围保证能滚动查看图片内容
            scrollView.contentSize = size
        }
    }
    
    // MARK: - 等比例缩放图片大小
    /// 根据 srollView 的宽度计算等比例缩放后的图片尺寸
    ///
    /// :param: image image
    ///
    /// :returns: 所放之后的 size
    private func displaySize(image: UIImage) -> CGSize {
        
        let w = scrollView.bounds.width
        let h = image.size.height * w / image.size.width
        
        return CGSizeMake(w, h)
    }
    
    
    // MARK: - 获取中等图URL
    private func bmiddleURL(url: NSURL) -> NSURL {
        
        // 1. URL转字符串
        var urlString = url.absoluteString
        
        // 2. 替换单词
        urlString = urlString.stringByReplacingOccurrencesOfString("/thumbnail/", withString: "/bmiddle/")
        
        return NSURL.init(string: urlString)!
    }
    
    // MARK: - 设置占位图
    /// - parameter image: 本地缓存的缩略图，如果缩略图下载失败，image 为 nil
    private func setPlaceHolder(image: UIImage?) {
        
        placeHolder.hidden = false
       
        // 1. 设置缩略图
        placeHolder.image = image
        
        // 2. 设置大小
        placeHolder.sizeToFit()
        
        // 3. 设置位置
        placeHolder.center = scrollView.center
    }
    
    // MARK: - 构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - 懒加载控件
    lazy var scrollView : UIScrollView = UIScrollView.init()    // 滚动视图
    lazy var imageView : UIImageView = UIImageView.init()   // 照片
    private lazy var placeHolder : ProgressImageView = ProgressImageView.init()    //占位图
    
}

// MARK: - 设置界面
extension PhotoBrowserCell {
    
    // 设置UI
    private func setupUI() {
    
        // 1. 添加控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        scrollView.addSubview(placeHolder)
        
        // 2. 布局
        scrollView.frame = CGRectMake(0, 0, bounds.width - 20, bounds.height)
        // 写法2
//        var rect = bounds
//        rect.size.width -= 20
//        scrollView.frame = rect
        
        // 3. 设置scrollView缩放
        scrollView.delegate = self
        scrollView.maximumZoomScale = 2
        scrollView.minimumZoomScale = 0.5
        
        // 4.添加手势事件
        let tap = UITapGestureRecognizer.init(target: self, action: "tapImage")
        imageView.userInteractionEnabled = true
        imageView.addGestureRecognizer(tap)
    }
}

// MARK: - UIScrollViewDelegate
extension PhotoBrowserCell : UIScrollViewDelegate {

    /// 返回被缩放的视图
    ///
    /// :param: scrollView scrollView
    ///
    /// :returns: UIView
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    /// 缩放过程一直调用
    func scrollViewDidZoom(scrollView: UIScrollView) {
//        print(imageView.bounds)
//        print(imageView.transform)
        
        Photodelegate?.photoBrowserCellDidZoom(imageView.transform.a)
    }
    
    /// 缩放完成后执行一次
    ///
    /// - parameter scrollView: scrollView
    /// - parameter view:       view 被缩放的视图
    /// - parameter scale:      被缩放的比例
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        
        // 如果缩放比例 < 1，直接关闭
        if scale < 1 {
            Photodelegate?.photoBrowserCellDidTapImage()
            return
        }
        
        // 1. 缩放后让图片居中
        var offsetY = (scrollView.bounds.height - view!.frame.height) * 0.5
        offsetY = offsetY < 0 ? 0 : offsetY
        
        var offsetX = (scrollView.bounds.width - view!.frame.width) * 0.5
        offsetX = offsetX < 0 ? 0 : offsetX
        
        scrollView.contentInset = UIEdgeInsetsMake(offsetY, offsetX, 0, 0)
//        // 以下测试代码，需要问刀哥
//        print("-----\(imageView.bounds)")
//        imageView.frame = CGRectMake(x, y, imageView.bounds.width, imageView.bounds.height)
//        print("+++++\(imageView.bounds)")
    }
}
